package tablero;


import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class TableroPrint {
	
	private int ancho;
	private int alto;
	private ArrayList<ArrayList<String>> matriz;
	/**
	 * Esta es la clase Tablero, la que nos va a ayudar a poder mostrar nuestro juego, por Pantalla.
	 * Se inicializa con el tablero que vamos a imprimir.
	 * 
	 * @param tablero
	 * 
	 */
	public TableroPrint(Tablero tab) {
		int columnas = tab.getLimite().getX();
		int filas = tab.getLimite().getY();
		
		System.out.println("Cantidad de filas:" +filas+" Cantidad de columnas:" + columnas);
		this.ancho = columnas;
		this.alto = filas;
	
		this.setMatriz(new ArrayList<ArrayList<String>>()); 
		agregarFilas(); 
		agregarColumnas("[  ]"); 
		

	}
	/**
	 * Este metodo agrega una columna, y solamente se usa para inicializarla.
	 * Recibe un String y un int que es el nro de columna a agregar.
	 * @param colum String
	 * @param put int
	 */
	public void agregarColumna(String colum, int put) {
		
		List<String> current = this.getMatriz().get(put);
		for (int i = 0; i < ancho; i++) {
			
			current.add(i,colum);
		}
	}
	/**
	 * Este metodo agrega una fila a la columna indicada por el nro put, idem del punto anterior. 
	 * @param fila ArrayList<String> 
	 * @param put int
	 */
	public void agregarFila(ArrayList<String> fila, int put) {
		
		this.getMatriz().add(put, fila);
	}
	/**
	 * Este metodo agrega varias columnas,respetanto la cantidad que se pasa por el constructor del Tablero. 
	 */
	public void agregarColumnas(String columna) {
		
		for (int i = 0; i < alto; i++) {
			
			agregarColumna(columna, i);
		}
	}
	/**
	 * Este metodo agrega varias filas,respetanto la cantidad que se pasa por el constructor del Tablero. 
	 */
	public void agregarFilas() {
		
		for (int i = 0; i < alto; i++) {
			
			agregarFila(new ArrayList<String>(), i);
		}
	}
	/**
	 * Este metodo agrega un elemento a la matriz y lo ubica en la coordenada que le pasan. 
	 */
	public void agregarElemento(Coordenada coord, String elem){
		
		int y= Math.abs(coord.getY()-(alto-1));
		List<String> filaActual = this.getMatriz().get(y);
		filaActual.remove(coord.getX());
		filaActual.add(coord.getX(), elem);
	}
	/**
	 * Este metodo saca un elemento de la matriz, indicado por la coordenada que le pasan. 
	 */
	public void sacarElemento(Coordenada coord){
		
		List<String> filaActual = this.getMatriz().get(coord.getY());
		
		filaActual.remove(coord.getX());
		filaActual.add(coord.getX(),"[  ]");
	}
	/**
	 * Este metodo Imprime el Tablero. Nos muesta su contenido. 
	 */
	public String imprimirTablero(){
		String tab="";
		for(int i = 0;i<alto;i++){ 
		    ArrayList<String> fila = this.getMatriz().get(i);
			for(int j=0;j<ancho;j++){ 
				tab=tab+(fila.get(j)); 
		    } 
			tab=tab+("\n"); //Cambio de linea
		}
		tab=tab+("\n");
		
		agregarColumnas("[  ]");
		return tab;
	}
	/**
	 * Este metodo Dibuja el tablero que le pasan por parametro. 
	 */
	public void dibujarTablero(Tablero tablero){
		dibujarPersonaje(tablero);
		dibujarEsfera(tablero);
		
	}
	
	/**
	 * Este metodo Dibuja los personajes del tablero que le pasan por parametro. 
	 */
	public void dibujarPersonaje(Tablero tablero){
		List<Personaje> personajes  = tablero.getPersonajes();

		for (int i = 0; i < personajes.size(); i++) {
			Personaje p = personajes.get(i);
			agregarElemento(p.getCoordenada(), "|"+p.getNombre().substring(0, 1)+"|");
		}

	}
	
	/**
	 * Este metodo Dibuja las Esferas del tablero que le pasan por parametro. 
	 */
	public void dibujarEsfera(Tablero tablero){
		List<Esfera> es  = tablero.getEsferas();
		for (int i = 0; i< es.size(); i++) {
			Esfera e = es.get(i);
			Coordenada c= e.getCoordenada();
			 agregarElemento(c, "E"+ e.getNumeroEstrellas());
		}
	}

	public int getAncho() {
		return ancho;
	}

	public void setAncho(int ancho) {
		this.ancho = ancho;
	}

	public int getAlto() {
		return alto;
	}

	public void setAlto(int alto) {
		this.alto = alto;
	}
	public void setMatriz(ArrayList<ArrayList<String>> matriz) {
		this.matriz = matriz;
	}
	
	public ArrayList<ArrayList<String>> getMatriz() {
		return matriz;
	}
	public List<Coordenada> coordDeUnaColumna(int nroFila){
		
		List<Coordenada> respuesta = new ArrayList<Coordenada>();
		if (nroFila <= alto){
			for (int i = 0; i < ancho; i++) {
				Coordenada coord = new Coordenada(nroFila,i);
				 respuesta.add(coord);
			}
		}
		return respuesta;
	}
public List<Coordenada> coordDeUnaFila(int nroColum){
		
		List<Coordenada> respuesta = new ArrayList<Coordenada>();
		if (nroColum <= ancho){
			for (int i = 0; i < alto; i++) {
				Coordenada coord = new Coordenada(i,nroColum);
				respuesta.add(coord);
			}
		}
		return respuesta;
	}



 
public static void main(String[] args) {

	Tablero t= new Tablero(8, 8);
	Random ran = new Random();
	t.renderEsferas();
	TableroPrint tablero = new TableroPrint(t);
	tablero.dibujarTablero(t);
	System.out.println(tablero.imprimirTablero());
 
}
	


	
}
